package com.saydc.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

import com.saydc.beans.Usuario;
import com.saydc.exceptions.UnableToDeleteException;
import com.saydc.utils.HibernateUtils;

public class UsuariosDAO {
	
	private static UsuariosDAO instance;

	public static UsuariosDAO getInstance(){
		if(instance == null){
			instance = new UsuariosDAO();
		}
		return instance;
	}
	
	@SuppressWarnings("unchecked")
	public List<Usuario> getUsuarios(){
		List<Usuario> listaUsuarios = new ArrayList<Usuario>();
		Session session = HibernateUtils.currentSession();
		listaUsuarios.addAll(session.createQuery("select u from Usuario u").list());
		HibernateUtils.closeSession();
		return listaUsuarios;
	}
	
	public Usuario getUsuario(String nombreUsuario){
		Session session = HibernateUtils.currentSession();
		Usuario usuario = (Usuario)session.createCriteria(Usuario.class).add(Restrictions.eq("usuario", nombreUsuario)).uniqueResult();
		HibernateUtils.closeSession();
		return usuario;
	}
	
	public void altaUsuario(Usuario usuario){
		Session session;
		Transaction tx = null;
		try{
			session = HibernateUtils.currentSession();
			tx = session.beginTransaction();
			session.save(usuario);
			tx.commit();
		}catch(Exception e){
			tx.rollback();
			e.printStackTrace();
			System.out.println("Error al insertar en la base");
		}finally{
			HibernateUtils.closeSession();
		}
	}

	public void borrarUsuario(Usuario usuario) throws UnableToDeleteException {
		Session session;
		Transaction tx = null;
		try{
			session = HibernateUtils.currentSession();
			tx = session.beginTransaction();
			session.delete(usuario);
			tx.commit();
		}catch(Exception e){
			tx.rollback();
			e.printStackTrace();
			System.out.println("Error al borrar en la base [eliminar usuario]");
			throw new UnableToDeleteException("El objeto se encuentra referenciado");
		}finally{
			HibernateUtils.closeSession();
		}
	}

	public void actualizarUsuario(Usuario usuario) {
		Session session;
		Transaction tx = null;
		try{
			session = HibernateUtils.currentSession();
			tx = session.beginTransaction();
			session.update(usuario);
			tx.commit();
		}catch(Exception e){
			tx.rollback();
			e.printStackTrace();
			System.out.println("Error al actualizar en la base");
		}finally{
			HibernateUtils.closeSession();
		}
	}

}
